1、信号介绍
	信号用于通知进程发生了一个异步事件，是在软件层面对硬件中断的模拟。
2、可靠信号和不可靠信号
	信号值小于SIGRTMIN的信号都是不可靠信号，不可靠信号不具备计数功能，如果不能及时处理可能会出现信号丢失，
信号值位于SIGRTMIN和SIGRTMAX之间的都是可靠信号，可靠信号有计数功能，即使不能及时也不会丢失。
3、信号处理方式
	1）采用默认处理方式
	2）绑定用户处理函数
	3）忽略，但是SIGKILL和SIGSTOP无法忽略
4、常用信号
	SIGINT 按Ctrl+c时发出，默认终止进程
	SIGQUIT 按Ctrl+\时发出，默认终止进程
	SIGKILL 立即结束进程，不能被忽略，不能改变处理方式
	SIGALRM 由定时器如alarm(),setitimer()等产生的定时器超时触发的信号 终止当前进程
	SIGSTOP 暂停进程，不能被忽略，不能改变处理方式
	SIGCHLD 子进程状态改变，默认忽略
	SIGPIPE 管道破裂，默认终止进程，写有名管道、无名管道、TCP发送时都可能会产生次信号
5、捕获信号
	在linux中signal()和sigaction()函数都可以安装信号处理函数
	signal:
		安装信号处理函数
		signum: 要处理的信号
		handler: 信号处理函数，为SIG_IGN则表示忽略该信号，为SIG_DFL采用系统默认处理方式
		成功返回之前的信号处理函数，失败返回SIG_ERR
		typedef void (*sighandler_t)(int signum);
		sighandler_t signal(int signum, sighandler_t handler);
	sigaction: 
		安装信号处理函数
		signum: 要处理的信号
		act: 新的信号处理方式
		oldact: 之前的信号处理方式
		成功返回0，失败返回-1
		struct sigaction {
			void     (*sa_handler)(int);	                   	//信号处理函数，为SIG_IGN忽略该信号，为SIG_DFL采用系统默认处理方式
			void     (*sa_sigaction)(int, siginfo_t *, void *);	//信号处理函数，当sa_flags中使用了SA_SIGINFO标志时使用该信号处理函数
			sigset_t   sa_mask;	                               	//信号处理过程中需要阻塞信号的信号集
			int        sa_flags;	                           	//信号处理标志
																//	SA_SIGINFO 信号附带的参数可以传递到信号处理函数中
																//	SA_NODEFER 执行信号处理函数是不阻塞此信号
																//	SA_RESTART 如果信号中断了某个系统调用，则系统会自动启动该系统调用
																//	SA_RESETHAND 信号处理函数只执行一次，后面采用默认方式处理
																//	SA_NOCLDSTOP 忽略子进程停止或恢复是产生的SIGCHLD信号
			void     (*sa_restorer)(void);
		};
		int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
6、信号发送
	向指定进程发送信号
	pid: 进程ID
	sig: 要发送的信号值
	成功返回0，失败返回-1
	int kill(pid_t pid, int sig);
	向当前进程发送信号
	sig: 要发送的信号值
	成功返回0，失败返回-1
	int raise(int sig);
7、alarm
	指定时间后向进程发送一次SIGALRM信号
	seconds: 时间，=0则不再发送SIGALRM信号
	成功返回之前的剩余时间，失败返回-1
	unsigned int alarm(unsigned int seconds);
8、定时器
	设置定时器
	which: 定时器类型，每个进程都有3个定时器，分别是：
		ITIMER_REAL 真实定时器，以系统时间来为基准，它可发出SIGALRM信号
		ITIMER_VIRTUAL 虚拟定时器，以进程在用户态下花费的时间来为基准，它可发出SIGVTALRM信号。
		ITIMER_PROF 进程定时器，以进程在用户态下和内核态下所费的时间来为基准，它可发出SIGPROF信号
	new_value: 指定定时时间
	old_value: 返回上一次的配置
	成功返回0，失败返回-1
	struct timeval {
		time_t      tv_sec; 	//秒
		suseconds_t tv_usec;	//微秒
	};
	struct itimerval {
		struct timeval it_interval; //重复的周期时间，为0则不重复
		struct timeval it_value;    //第一次超时时间，为0则关闭定时器
	};
	int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
9、信号集
	信号集即多个信号组成的集合，其数据类型为sigset_t。
	信号集相关的函数：
		清空信号集
		set: 信号集
		成功返回0，失败返回-1
		int sigemptyset(sigset_t *set);
		填充信号集，调用后set中包含linux的64个信号
		set: 信号集
		成功返回0，失败返回-1
		int sigfillset(sigset_t *set);
		向信号集添加一个信号
		set: 信号集
		signum: 要添加的信号
		成功返回0，失败返回-1
		int sigaddset(sigset_t *set, int signum);
		从信号集中删除一个信号
		set: 信号集
		signum: 要删除的信号
		成功返回0，失败返回-1
		int sigdelset(sigset_t *set, int signum);
		判断信号是否在信号集中
		set: 信号集
		signum: 要判断的信号
		在返回1，不在返回0，失败返回-1
		int sigismember(const sigset_t *set, int signum);
		设置阻塞信号集，sigprocmask函数只能用于单线程情况，在多线程中每个线程都有一个独立阻塞信号集，但是所有线
		程共享信号处理函数，当信号发生时会在当前线程上下文执行信号处理函数（线程阻塞信号除外），另外被阻塞的信号
		并没有丢失
		how: 处理方式；SIG_BLOCK 追加set中的信号，SIG_UNBLOCK 删除set中的信号，SIG_SETMASK 重新设置阻塞信号集为set
		set: 信号集
		oldset: 之前的阻塞信号集
		成功返回0，失败返回-1
		int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
		int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
		获取已经到达而未被处理的信号的信号集
		set: 信号集
		成功返回0，失败返回-1
		int sigpending(sigset_t *set);